package com.example.utils;

//import android.util.Log;
//
//import org.aspectj.lang.JoinPoint;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.AfterReturning;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Before;
//import org.aspectj.lang.annotation.Pointcut;
//
//import java.util.Arrays;
//import java.util.List;
//
//@Aspect
//public class TraceAop {
//    private static  String TAG = "trace";
//    /**
//     * 需要过滤的类数组
//     */
//    String[]  filterClass={"ForegroundCallbacks","ClassAdapter","MyClassBean",
//            "AppLifecycler"};
//    /**
//     * 用集合的方式 方便过滤
//     */
//    List filterList= Arrays.asList(filterClass);
///****************************************打印方法调用链 A方式 ************************************************/
///*
//A方法优、缺点
//* 优点：获取各类方法调用
//* 缺点：方法内调用方法，打印的方法执行顺序存在顺序混乱，不支持 execution 改为call执行
//*/
///*    *
//     * 需要查看方法调用时 可以用这个切点
//     * execution(修饰符  返回值  包.类.方法名(参数) throws异常)*/
//
//    @AfterReturning(pointcut = "execution(* *.*(..))", returning = "retVal")
//    public void DebugReturnLog(JoinPoint joinPoint, Object retVal) throws Throwable {
//        Object target = joinPoint.getTarget();
//        String targetName = "";
//        if (target != null) {
//            TAG="trace_return";
//            targetName = target.getClass().getSimpleName();
//            if (!filterList.contains(targetName)) {
////                Log.d(TAG, " 调用A--> 返回类型: " + joinPoint.getSignature());
//            }
//        }
//    }
//
///******************************************* A方式结束 *************************************************/
//
//
///****************************************打印方法调用链 B方式***********************************************/
///*
//B方法优、缺点
//* 优点：获取各类方法顺序调用，
//        可以将execution关键字修改为call，打印方法执行
//* 缺点：只能打印void 方法，其他返回值类型的无法打印，存在打印方法缺失的问题
//*/
//    @Pointcut("execution(* *..*.*(..))")
//    public void Method() {
//
//    }
//
//    @Around("Method()")
//    public void printMethod(ProceedingJoinPoint proceedingJoinPoint) {
//        if (proceedingJoinPoint != null) {
//            TAG="trace_around";
//            try {
//                Object target = proceedingJoinPoint.getTarget();
//                String targetName = "";
//                if (target != null) {
//                    targetName = target.getClass().getSimpleName();
//                    if (!filterList.contains(targetName)) {
////                        Log.d(TAG, "调用B : " + proceedingJoinPoint);
//                    }
//                }
//
//                proceedingJoinPoint.proceed();
//            } catch (Throwable throwable) {
//                throwable.printStackTrace();
//                Log.d(TAG, "call method error:", throwable);
//            }
//        }
//    }
///**************************************** B方式结束 *************************************************/
//
//
//    /****************************************打印方法调用链 C方式***********************************************/
///*
//C方法优、缺点
//* 优点，兼顾A和B，可顺序打印，所有手动添加方法
//* 缺点，不支持 execution 改为call执行
// */
//    @Pointcut("execution(* *.*(..))")
//    public void allMethod() {
//
//    }
//
//    @Before("allMethod()")
//    public void doBefore(JoinPoint joinPoint) {
//        TAG="trace_before";
//        try {
//            Object target = joinPoint.getTarget();
//            String targetName = "";
//            if (target != null) {
//                targetName = target.getClass().getSimpleName();
//                if (!filterList.contains(targetName)) {
//                    Log.d(TAG, " 调用C--> 返回类型: " + joinPoint.getSignature());
//                }
//            }
//        } catch (Throwable throwable) {
//            throwable.printStackTrace();
//            Log.d(TAG, "call method error:", throwable);
//        }
//    }
//
///**************************************** C方式结束 *************************************************/
//}
public class TraceAop {
}
